home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2007 December / PCWKCD1207B.iso / Blogowanie poza sfera / Flock 1.0 beta / flock-1.0RC3.en-US.win32.exe / flock / modules / JSON.jsm < prev    next >
Text File  |  2007-10-18  |  7KB  |  175 lines

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  3.  *
  4.  * The contents of this file are subject to the Mozilla Public License Version
  5.  * 1.1 (the "License"); you may not use this file except in compliance with
  6.  * the License. You may obtain a copy of the License at
  7.  * http://www.mozilla.org/MPL/
  8.  *
  9.  * Software distributed under the License is distributed on an "AS IS" basis,
  10.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  11.  * for the specific language governing rights and limitations under the
  12.  * License.
  13.  *
  14.  * The Original Code is Mozilla code.
  15.  *
  16.  * The Initial Developer of the Original Code is
  17.  * Simon B├╝nzli <zeniko@gmail.com>
  18.  * Portions created by the Initial Developer are Copyright (C) 2006-2007
  19.  * the Initial Developer. All Rights Reserved.
  20.  *
  21.  * Contributor(s):
  22.  *
  23.  * Alternatively, the contents of this file may be used under the terms of
  24.  * either the GNU General Public License Version 2 or later (the "GPL"), or
  25.  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  26.  * in which case the provisions of the GPL or the LGPL are applicable instead
  27.  * of those above. If you wish to allow use of your version of this file only
  28.  * under the terms of either the GPL or the LGPL, and not to allow others to
  29.  * use your version of this file under the terms of the MPL, indicate your
  30.  * decision by deleting the provisions above and replace them with the notice
  31.  * and other provisions required by the GPL or the LGPL. If you do not delete
  32.  * the provisions above, a recipient may use your version of this file under
  33.  * the terms of any one of the MPL, the GPL or the LGPL.
  34.  *
  35.  * ***** END LICENSE BLOCK ***** */
  36.  
  37. /**
  38.  * Utilities for JavaScript code to handle JSON content.
  39.  * See http://www.json.org/ for comprehensive information about JSON.
  40.  *
  41.  * Import this module through
  42.  *
  43.  * Components.utils.import("resource://gre/modules/JSON.jsm");
  44.  *
  45.  * Usage:
  46.  *
  47.  * var newJSONString = JSON.toString( GIVEN_JAVASCRIPT_OBJECT );
  48.  * var newJavaScriptObject = JSON.fromString( GIVEN_JSON_STRING );
  49.  *
  50.  * Note: For your own safety, Objects/Arrays returned by
  51.  *       JSON.fromString aren't instanceof Object/Array.
  52.  */
  53.  
  54. EXPORTED_SYMBOLS = ["JSON"];
  55.  
  56. // The following code is a loose adaption of Douglas Crockford's code
  57. // from http://www.json.org/json.js (public domain'd)
  58.  
  59. // Notable differences:
  60. // * Unserializable values such as |undefined| or functions aren't
  61. //   silently dropped but always lead to a TypeError.
  62. // * An optional key blacklist has been added to JSON.toString
  63.  
  64. var JSON = {
  65.   /**
  66.    * Converts a JavaScript object into a JSON string.
  67.    *
  68.    * @param aJSObject is the object to be converted
  69.    * @param aKeysToDrop is an optional array of keys which will be
  70.    *                    ignored in all objects during the serialization
  71.    * @return the object's JSON representation
  72.    *
  73.    * Note: aJSObject MUST not contain cyclic references.
  74.    */
  75.   toString: function JSON_toString(aJSObject, aKeysToDrop) {
  76.     // these characters have a special escape notation
  77.     const charMap = { "\b": "\\b", "\t": "\\t", "\n": "\\n", "\f": "\\f",
  78.                       "\r": "\\r", '"': '\\"', "\\": "\\\\" };
  79.     
  80.     // we use a single string builder for efficiency reasons
  81.     var pieces = [];
  82.     
  83.     // this recursive function walks through all objects and appends their
  84.     // JSON representation (in one or several pieces) to the string builder
  85.     function append_piece(aObj) {
  86.       if (typeof aObj == "boolean") {
  87.         pieces.push(aObj ? "true" : "false");
  88.       }
  89.       else if (typeof aObj == "number" && isFinite(aObj)) {
  90.         // there is no representation for infinite numbers or for NaN!
  91.         pieces.push(aObj.toString());
  92.       }
  93.       else if (typeof aObj == "string") {
  94.         aObj = aObj.replace(/[\\"\x00-\x1F\u0080-\uFFFF]/g, function($0) {
  95.           // use the special escape notation if one exists, otherwise
  96.           // produce a general unicode escape sequence
  97.           return charMap[$0] ||
  98.             "\\u" + ("0000" + $0.charCodeAt(0).toString(16)).slice(-4);
  99.         });
  100.         pieces.push('"' + aObj + '"')
  101.       }
  102.       else if (aObj === null) {
  103.         pieces.push("null");
  104.       }
  105.       // if it looks like an array, treat it as such - this is required
  106.       // for all arrays from either outside this module or a sandbox
  107.       else if (aObj instanceof Array ||
  108.                typeof aObj == "object" && "length" in aObj &&
  109.                (aObj.length === 0 || aObj[aObj.length - 1] !== undefined)) {
  110.         pieces.push("[");
  111.         for (var i = 0; i < aObj.length; i++) {
  112.           append_piece(aObj[i]);
  113.           pieces.push(",");
  114.         }
  115.         if (pieces[pieces.length - 1] == ",")
  116.           pieces.pop(); // drop the trailing colon
  117.         pieces.push("]");
  118.       }
  119.       else if (typeof aObj == "object") {
  120.         pieces.push("{");
  121.         for (var key in aObj) {
  122.           // allow callers to pass objects containing private data which
  123.           // they don't want the JSON string to contain (so they don't
  124.           // have to manually pre-process the object)
  125.           if (aKeysToDrop && aKeysToDrop.indexOf(key) != -1)
  126.             continue;
  127.           
  128.           append_piece(key.toString());
  129.           pieces.push(":");
  130.           append_piece(aObj[key]);
  131.           pieces.push(",");
  132.         }
  133.         if (pieces[pieces.length - 1] == ",")
  134.           pieces.pop(); // drop the trailing colon
  135.         pieces.push("}");
  136.       }
  137.       else {
  138.         throw new TypeError("No JSON representation for this object!");
  139.       }
  140.     }
  141.     append_piece(aJSObject);
  142.     
  143.     return pieces.join("");
  144.   },
  145.  
  146.   /**
  147.    * Converts a JSON string into a JavaScript object.
  148.    *
  149.    * @param aJSONString is the string to be converted
  150.    * @return a JavaScript object for the given JSON representation
  151.    */
  152.   fromString: function JSON_fromString(aJSONString) {
  153.     if (!this.isMostlyHarmless(aJSONString))
  154.       throw new SyntaxError("No valid JSON string!");
  155.     
  156.     var s = new Components.utils.Sandbox("about:blank");
  157.     return Components.utils.evalInSandbox("(" + aJSONString + ")", s);
  158.   },
  159.  
  160.   /**
  161.    * Checks whether the given string contains potentially harmful
  162.    * content which might be executed during its evaluation
  163.    * (no parser, thus not 100% safe! Best to use a Sandbox for evaluation)
  164.    *
  165.    * @param aString is the string to be tested
  166.    * @return a boolean
  167.    */
  168.   isMostlyHarmless: function JSON_isMostlyHarmless(aString) {
  169.     const maybeHarmful = /[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/;
  170.     const jsonStrings = /"(\\.|[^"\\\n\r])*"/g;
  171.     
  172.     return !maybeHarmful.test(aString.replace(jsonStrings, ""));
  173.   }
  174. };
  175.